package com.atguigu.gulimall.seckill.scheduled;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Slf4j
@Component
//@EnableAsync
//@EnableScheduling
public class HelloSchedule {

    /**
     * 和quartz的区别
     * （1）spring只支持6位参数，最后一位 年 spring不支持
     * （2）周一到周天，spring中就用1-7表示；在quartz中是周天是1，周一是2...
     * (3)这里还有一个很重要的东西，就是定时任务的阻塞问题，假如定时任务每秒执行一次，但执行一次要3秒
     * 第一秒任务没执行完，第二秒的任务会执行吗？
     * 实测会阻塞
     * 但是业务上肯定不希望第一个任务执行慢影响第二个任务
     * 有三种处理办法：
     * (1)直接在定时任务的逻辑里面用异步任务来做
     * CompletableFuture.runAsync(() -> {})
     * (2)定时任务本身也是支持线程池的
     *TaskSchedulingAutoConfiguration ->TaskSchedulingProperties
     * 绑定了spring.task.scheduling属性
     * 因此可以通过spring.task.scheduling.size来设置（默认是1，因此会阻塞）
     * 但是spring.task.scheduling.size这个设置好像有的spring版本好像不生效
     * (3)通过@EnableAsync和@Async来实现异步
     * 底层也是有设置线程池
     * 配置类：TaskExecutionAutoConfiguration -> TaskExecutionProperties ->绑定属性spring.task.execution
     * 所以可以通过
     * spring.task.execution.coreSize 和 spring.task.execution.maxSize等来调整参数大小
     * 并且注意@Async不仅可以用于定时任务，也可以用于普通的方法间的调用
     * 比如A方法调用B方法，在B方法上标注@Async就能实现异步调用！！
     */
//    @Async
//    @Scheduled(cron = "* * * ? * 7")
    public void hello() throws InterruptedException {
        Thread.sleep(3000);
        log.info("hello...");
    }

}
